
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;

import modelo.*;

public class Principal {

	
	public static void main(String[] args) throws IOException {
		
		
		BufferedReader lector = new BufferedReader(new InputStreamReader(System.in));
		
		ArrayList<String> arr_nom = new ArrayList<String>();
		Liga liga = new Liga();
		
		boolean seguir = true;
		String opcion;
		
		while(seguir) {
			//Menú Principal de Opciones
			System.out.println("Menu Principal");
			System.out.println("Seleccione una Opción: ");
			System.out.println("\tAñadir Umpires (1), Añadir Equipos (2),  Generar Partidos (3), Salir (4)");
			System.out.print("Opción: ");
			opcion = lector.readLine();
			
			if(opcion.equals("1")) { //Añadir Umpires
				String respuesta = "S";
				while(respuesta.equalsIgnoreCase("S")) {
					String cedula, nombre, apellido, fecha_nac;
					System.out.println();
					System.out.println("     Añadir Umpire");
					System.out.println("------------------------");
					System.out.print("Cédula: ");
					cedula = lector.readLine();
					System.out.print("Nombre: ");
					nombre = lector.readLine();
					System.out.print("Apellido: ");
					apellido = lector.readLine();
					System.out.print("Fecha Nac (DD/MM/AAAA): ");
					fecha_nac = lector.readLine();
					
					/*
					 * Se convierte fecha_nac de String (DD/MM/AAAA) a un arreglo de Strings, tal 
					 * que quede en f[0] = DD, en f[1] = MM y en f[2] = AAAA
					 */
					String f[] = fecha_nac.split("/");
					
					 // Se convierte f  de un array de Strings a un array de Ints
					int fe[] = {Integer.parseInt(f[0]), Integer.parseInt(f[1]), Integer.parseInt(f[2])};
					
					 // Se crea un atributo de tipo Calendar (java.util.Calendar) para almacenar la fecha de nacimiento.
					Calendar fech = Calendar.getInstance();
					
					/* Se le asignan los datos cargados de la fecha usando la funcion set de Calendar
					 * set(año,mes,dia)
					 */
					fech.set(fe[2], fe[1]-1, fe[0]);
					
					Arbitro arb = new Arbitro(cedula,nombre,apellido,fech);
					liga.AnadirArbitro(arb);
					
					System.out.println();
					System.out.print("¿Desea añadir otro árbitro?(S/N): ");
					respuesta = lector.readLine();
				}
			}
			else
				if(opcion.equals("2")) { //Añadir Equipo
					String cod, nom, anno_fund, ciu, est, ruta;
					System.out.println();
					System.out.println("Añadir Equipo");
					System.out.println("-------------");
					System.out.print("Código: ");
					cod = lector.readLine();
					System.out.print("Nombre: ");
					nom = lector.readLine();
					System.out.print("Año de Fundación(AAAA): ");
					anno_fund = lector.readLine();
					System.out.print("Ciudad: ");
					ciu = lector.readLine();
					System.out.print("Estadio: ");
					est = lector.readLine();
					//Se instancia el objeto Equipo con sus atributos
					Equipo e = new Equipo(cod, nom, anno_fund, ciu, est);
					
					System.out.println();
					System.out.println("Cargar Jugadores");
					System.out.println("----------------");
					//Se lee la ruta absoluta o relativa del archivo
					System.out.print("Archivo de Jugadores del Equipo: ");
					ruta = lector.readLine();
					//Se instancia el lector de archivos
					BufferedReader arch = new BufferedReader(new FileReader(ruta));
					//Arreglo de jugadores
					ArrayList<Jugador> jugadores = new ArrayList<Jugador>();

					//while para cargar los datos de los jugadores
					while(arch.ready()) {
						
						String cedula, nombre, apellido, f_n, posicion;
						int crr_imp, cuad;
						cedula = arch.readLine();
						nombre = arch.readLine();
						apellido = arch.readLine();
						f_n = arch.readLine();
						posicion = arch.readLine();
						crr_imp = Integer.parseInt(arch.readLine());
						cuad = Integer.parseInt(arch.readLine());
						String f[] = f_n.split("/");
						Calendar fech = Calendar.getInstance();
						fech.set(Integer.parseInt(f[2]), (Integer.parseInt(f[1])-1), Integer.parseInt(f[0]));
						Jugador j = new Jugador(cedula,nombre,apellido,fech,posicion,crr_imp,cuad);
						jugadores.add(j);
					}
					System.out.println("Se han cargado " + jugadores.size() + " jugadores del equipo " + e.getNombre() + ".");
					e.setJugadores(jugadores);
					liga.AnadirEquipo(e);
					//Se cierra el archivo que se leyó
					arch.close();
					
					arr_nom.add(nom);
					
				}
				else
					if(opcion.equals("3")) { //Generar partidos
						//if(liga.CantidadArbitros() < liga.PartidosPorDia())
						if(liga.CantidadArbitros() < liga.PartidosPorDia())
							System.out.println("ERROR: No hay suficientes árbitros");
						else {
							System.out.print("Fecha Inicial para los partidos (DD/MM/AAAA): ");
							String fi = lector.readLine();
							String f_i[] = fi.split("/");
							Calendar fch = Calendar.getInstance();
							fch.set(Integer.parseInt(f_i[2]), Integer.parseInt(f_i[1])-1, Integer.parseInt(f_i[0]));
							/*
							 * Se crea el arreglo de nombres de los equipos para inicializar los 
							 * contadores de juegos
							 */
							ArrayList<String> nom = new ArrayList<String>();
							for(int i=0; i<liga.CantidadEquipos(); i++) {
								nom.add(liga.ObtenerEquipo(i).getNombre());
							}
								
							liga.InicializarContadoresJuegos(nom);
							
							//Ciclo para la cantidad de dias que habra juego
							for(int i=0; i<liga.CantidadFechas(); i++) {
								//Set para guardar los equipos que han jugado por dia
								Set<String> eq = new HashSet<String>();
								Set<String> ump = new HashSet<String>();
								System.out.println("Fecha: " + fch.get(Calendar.DAY_OF_MONTH) + "/" + (fch.get(Calendar.MONTH)+1));
								/*
								 * Se compara que el dia no sea lunes, si el dia es lunes
								 * se decrementa el control del ciclo en 1
								 * Si el dia no es lunes se entra en el ciclo para
								 * realizar los juegos de ese dia
								 */
								if(fch.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY)
										i--;
								else
									for(int j=0; j<liga.PartidosPorDia(); j++) { //Ciclo de juegos por dia
										Equipo e1 = null;
										Equipo e2 = null;
										boolean verif = true;
										HashSet<Equipo> seteqdia = new HashSet<Equipo>();
										seteqdia.addAll(liga.getEquipos());
										do {
											e1 = liga.ObtenerEquipoAleatorio();
										}while(eq.contains(e1.getNombre()));
										eq.add(e1.getNombre());
										System.out.println(e1.getNombre());
										do {
											e2 = liga.ObtenerEquipoAleatorio();
											if(eq.contains(e2.getNombre()))
												verif = true;
											else
												verif = false;
										}while(!(e1.getJuegosTotalesvsEquipo(e2.getNombre()) < 4) || verif);
										eq.add(e2.getNombre());
										seteqdia.remove(e2);
										System.out.println("Juegos totales de " + e1.getNombre() + " vs " + e2.getNombre() + ": " + e1.getJuegosTotalesvsEquipo(e2.getNombre()));
										Arbitro arb = new Arbitro();
										do {
											arb = liga.ObtenerArbitroAleatorio();
										}while(ump.contains(arb.getNombre()));
										liga.GenerarPartido(e1, e2, arb);
										System.out.println("Partidos ya: " + liga.cantidadPartidos());
									}
								fch.add(Calendar.DAY_OF_MONTH, 1);
							}
							System.out.println("Partidos generados automaticamente.");
							System.out.println("Se han generado " + liga.cantidadPartidos() + " partidos.");
						}
					}
					else
						break;
		}

	}

}
